export default {
  inserted(el, vDir, vNode) {
    // vDir.value 有指令的参数
    if(el.tagName.toLowerCase() !== 'input'){
      const inputEl =  el.querySelector('input');
      if(inputEl) el = inputEl;
    }
    let content
    // 设置输入框的值,触发input事件,改变v-model绑定的值
    const setVal = val => {
      if (vNode.componentInstance) {
        // 如果是自定义组件就触发自定义组件的input事件
        vNode.componentInstance.$emit('input', val)
      } else {
        // 如果是原生组件就触发原生组件的input事件
        el.value = val
        el.dispatchEvent(new Event('input'))
      }
    }
    // 按键按下=>只允许输入 数字/小数点/减号
    el.addEventListener('keypress', event => {
      const e = event || window.event
      const inputKey = String.fromCharCode(typeof e.charCode === 'number' ? e.charCode : e.keyCode)
      const re = vDir.value?.noPoint ? /\d|-/ : /\d|\.|-/;
      content = e.target.value
      // 定义方法,阻止输入
      function preventInput() {
        if (e.preventDefault) {
          e.preventDefault()
        } else {
          e.returnValue = false
        }
      }
      if (!re.test(inputKey) && !e.ctrlKey) {
        preventInput()
      } else if (content.indexOf('.') > 0 && inputKey === '.') {
        // 已有小数点,再次输入小数点
        preventInput()
      }
    })
    // 按键弹起=>并限制最大最小
    el.addEventListener('input', event => {
      const e = event || window.event
      content = parseFloat(e.target.value)
      if (!content) {
        content = 0
      }
      let arg_max
      let arg_min
      if (vDir.value) {
        arg_max = parseFloat(vDir.value.max)
        arg_min = parseFloat(vDir.value.min)
      }
      if (arg_max !== undefined && content > arg_max) {
        setVal(arg_max)
        content = arg_max
      }
      if (arg_min !== undefined && content < arg_min) {
        setVal(arg_min)
        content = arg_min
      }
    })
    // 失去焦点=>保留指定位小数
    el.addEventListener('focusout', event => { // 此处会在 el-input 的 @change 后执行
      let e = event || window.event

      if(isNaN(e.target.value)){
        e.target.value = content;
        setVal(e.target.value);
        return;
      };

      // todo 没改好
      content = e.target.value;
      if (content === '') {
        content = 0;
      }
      if (parseInt(e.target.value) == parseFloat(e.target.value)) {
        e.target.value = content;
      } else {
        content = parseFloat(e.target.value);
        const precision = content.toString().split('.')[1].length;
        let arg_precision = 1;

        if(vDir.value?.precision !== undefined){
          if (!content) {
            let num = 0;
            content = num.toFixed(vDir.value.precision);
          }
          if (content >= 100) {
            content = content % 100;
          }
          if (content >= 1000) {
            content = content % 1000;
          }
          arg_precision = parseFloat(vDir.value.precision);
        }else if (precision === 1) {
          if (!content) {
            content = 0.0;
          }
          if (content >= 1000) {
            content = content % 1000;
          }
          arg_precision = parseFloat(1);
        } else if (precision >= 2) {
          if (!content) {
            content = 0.00;
          }
          if (content >= 100) {
            content = content % 100;
          }
          arg_precision = parseFloat(2);
        }

        e.target.value = content.toFixed(arg_precision);
        setVal(e.target.value)
      }
    })
  }
}
